package es.ojugames.yincana.bd;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;

public class YincanaProvider extends ContentProvider {
	public static final String PROVIDER_NAME = "es.ojugames.yincana";
	public static final Uri COMUNIDADES_URI = Uri.parse("content://" + PROVIDER_NAME + "/comunidades");
	public static final Uri PROVINCIAS_URI = Uri.parse("content://" + PROVIDER_NAME + "/provincias");
	public static final Uri LOCALIDADES_URI = Uri.parse("content://" + PROVIDER_NAME + "/localidades");
	public static final Uri CATEGORIAS_URI = Uri.parse("content://" + PROVIDER_NAME + "/categorias");
	public static final Uri RUTAS_URI = Uri.parse("content://" + PROVIDER_NAME + "/rutas");
	public static final Uri TIPOPRUEBAS_URI = Uri.parse("content://" + PROVIDER_NAME + "/tipopruebas");
	
	
	public static final String COMUNIDADES_TABLE = "comunidades";
	public static final String PROVINCIAS_TABLE = "provincias";
	public static final String LOCALIDADES_TABLE = "localidades";
	public static final String CATEGORIAS_TABLE = "categorias";
	public static final String RUTAS_TABLE = "rutas";
	public static final String TIPOPRUEBAS_TABLE = "tipopruebas";
	
	
	public static final String _ID = "_id";
	public static final String NOMBRE = "nombre";
	
	private static final int COMUNIDADES = 1;
	private static final int COMUNIDADES_ID = 2;
	private static final int PROVINCIAS = 3;
	private static final int PROVINCIAS_ID = 4;
	private static final int CATEGORIAS = 5;
	private static final int CATEGORIAS_ID = 6;
	private static final int RUTAS = 7;
	private static final int RUTAS_ID = 8;
	private static final int LOCALIDADES = 9;
	private static final int LOCALIDADES_ID = 10;
	private static final int TIPOPRUEBAS = 11;
	private static final int TIPOPRUEBAS_ID = 12;
	
	private static final UriMatcher uriMatcher; static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(PROVIDER_NAME, "comunidades", COMUNIDADES);
		uriMatcher.addURI(PROVIDER_NAME, "comunidades/#", COMUNIDADES_ID);
		uriMatcher.addURI(PROVIDER_NAME, "provincias", PROVINCIAS);
		uriMatcher.addURI(PROVIDER_NAME, "provincias/#", PROVINCIAS_ID);
		uriMatcher.addURI(PROVIDER_NAME, "categorias", CATEGORIAS);
		uriMatcher.addURI(PROVIDER_NAME, "categorias/#", CATEGORIAS_ID);
		uriMatcher.addURI(PROVIDER_NAME, "rutas", RUTAS);
		uriMatcher.addURI(PROVIDER_NAME, "rutas/#", RUTAS_ID);
		uriMatcher.addURI(PROVIDER_NAME, "localidades", LOCALIDADES);
		uriMatcher.addURI(PROVIDER_NAME, "localidades/#", LOCALIDADES_ID);
		uriMatcher.addURI(PROVIDER_NAME, "tipopruebas", TIPOPRUEBAS);
		uriMatcher.addURI(PROVIDER_NAME, "tipopruebas/#", TIPOPRUEBAS_ID);
	}
	
	private SQLiteDatabase yincandaDB;
	
		
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		throw new IllegalArgumentException("Operacion no soportada para esta URI: " + uri);
		//return 0;
	}

	@Override
	public String getType(Uri uri) {
		if (uriMatcher.match(uri) % 2 == 1) {
			return "vnd.android.cursor.dir/vnd.ojugames.yincana";
		} else if (uriMatcher.match(uri) % 2 == 0) {
			return "vnd.android.cursor.item/vnd.ojugames.yincana";
		} else {
			throw new IllegalArgumentException("Uri no soportada: " + uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		String tabla = "";
		Uri contentUri = null;
		
		if (uriMatcher.match(uri) == COMUNIDADES || uriMatcher.match(uri) == COMUNIDADES_ID
				|| uriMatcher.match(uri) == PROVINCIAS || uriMatcher.match(uri) == PROVINCIAS_ID
				|| uriMatcher.match(uri) == LOCALIDADES || uriMatcher.match(uri) == LOCALIDADES_ID) {
			throw new IllegalArgumentException("Operacion no soportada para esta URI: " + uri);
		} else if (uriMatcher.match(uri) == RUTAS || uriMatcher.match(uri) == RUTAS_ID){
			tabla = RUTAS_TABLE;
			contentUri = RUTAS_URI;
		}
		
		long rowID = yincandaDB.insert(tabla, "", values);
		
		if (rowID > 0) {
			Uri _uri = ContentUris.withAppendedId(contentUri, rowID);
			getContext().getContentResolver().notifyChange(_uri, null);
			return _uri;
		} else {
			throw new SQLException("Error insertando el registro");
		}
	}

	@Override
	public boolean onCreate() {
		Context context = getContext();
		YincanaSQLHelper dbHelper = new YincanaSQLHelper(context);
		yincandaDB = dbHelper.getWritableDatabase();
		
		return (yincandaDB == null) ? false : true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		
		SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
		
		if (uriMatcher.match(uri) == COMUNIDADES || uriMatcher.match(uri) == COMUNIDADES_ID) {
			sqlBuilder.setTables(COMUNIDADES_TABLE);
		} else if (uriMatcher.match(uri) == PROVINCIAS || uriMatcher.match(uri) == PROVINCIAS_ID) {
			sqlBuilder.setTables(PROVINCIAS_TABLE);
		} else if (uriMatcher.match(uri) == CATEGORIAS || uriMatcher.match(uri) == CATEGORIAS_ID) {
			sqlBuilder.setTables(CATEGORIAS_TABLE);
		} else if (uriMatcher.match(uri) == LOCALIDADES || uriMatcher.match(uri) == LOCALIDADES_ID) {
			sqlBuilder.setTables(LOCALIDADES_TABLE);
		} else if (uriMatcher.match(uri) == RUTAS || uriMatcher.match(uri) == RUTAS_ID) {
			sqlBuilder.setTables(RUTAS_TABLE);
		} else if (uriMatcher.match(uri) == TIPOPRUEBAS || uriMatcher.match(uri) == TIPOPRUEBAS_ID) {
			sqlBuilder.setTables(TIPOPRUEBAS_TABLE);
		}
		
		if  (uriMatcher.match(uri) % 2 == 0) {
			sqlBuilder.appendWhere(_ID + " = " + uri.getPathSegments().get(1));
		}
		
		if (sortOrder == null || sortOrder == "") {
			sortOrder = NOMBRE;
		}
		
		Cursor c = sqlBuilder.query(yincandaDB, projection, selection, selectionArgs, null, null, sortOrder);
		c.setNotificationUri(getContext().getContentResolver(), uri);
		
		return c;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		throw new IllegalArgumentException("Operacion no soportada para esta URI: " + uri);
		//return 0;
	}

}
